home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / pc / DirectX SDK / DXSDK / samples / Multimedia / Direct3D / SkinnedMesh / skinnedmesh.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-10-08  |  9.6 KB  |  424 lines

  1. #pragma once
  2.  
  3. #ifndef __MVIEW_H__
  4. #define __MVIEW_H__
  5.  
  6.  
  7.  
  8. /*//////////////////////////////////////////////////////////////////////////////
  9. //
  10. // File: mview.h
  11. //
  12. // Copyright (C) 2000-2001 Microsoft Corporation. All Rights Reserved.
  13. //
  14. //
  15. //////////////////////////////////////////////////////////////////////////////*/
  16.  
  17. #define GXRELEASE(_p) do { if ((_p) != NULL) {(_p)->Release(); (_p) = NULL;} } while (0)
  18.  
  19. enum METHOD {
  20.     D3DNONINDEXED,
  21.     D3DINDEXED,
  22.     SOFTWARE,
  23.     D3DINDEXEDVS,
  24.     NONE
  25. };
  26.  
  27. struct SMeshContainer
  28. {
  29.     ID3DXMesh *pMesh;
  30.     D3DMATERIAL8 *rgMaterials;
  31.     LPDIRECT3DTEXTURE8 *pTextures;
  32.     DWORD cpattr;
  33.     DWORD cMaterials;
  34.     DWORD iAttrSplit;
  35.  
  36.     SMeshContainer *pmcNext;
  37.  
  38.     char *szName;
  39.  
  40.     // Skin info
  41.     LPD3DXSKINMESH m_pSkinMesh;
  42.     D3DXATTRIBUTERANGE *m_pAttrTable;
  43.     D3DXMATRIX** m_pBoneMatrix;
  44.     LPD3DXBUFFER m_pBoneNamesBuf;
  45.     LPD3DXBUFFER m_pBoneOffsetBuf;
  46.     D3DXMATRIX* m_pBoneOffsetMat;
  47.     DWORD* m_rgiAdjacency;
  48.     DWORD m_numBoneComb;
  49.     DWORD m_maxFaceInfl;
  50.     LPD3DXBUFFER m_pBoneCombinationBuf;
  51.     METHOD  m_Method;
  52.     DWORD m_paletteSize;
  53.     BOOL m_bUseSW;
  54.  
  55.     SMeshContainer()
  56.         :pMesh(NULL),
  57.             rgMaterials(NULL),
  58.             pTextures(NULL),
  59.             cpattr(0),
  60.             iAttrSplit(0),
  61.             cMaterials(0),
  62.             pmcNext(NULL),
  63.             szName(NULL),
  64.             m_pSkinMesh(NULL),
  65.             m_pAttrTable(NULL),
  66.             m_pBoneMatrix(NULL),
  67.             m_pBoneNamesBuf(NULL),
  68.             m_pBoneOffsetBuf(NULL),
  69.             m_pBoneOffsetMat(NULL),
  70.             m_rgiAdjacency(NULL),
  71.             m_numBoneComb(0),
  72.             m_maxFaceInfl(0),
  73.             m_pBoneCombinationBuf(NULL),
  74.             m_Method(NONE),
  75.             m_paletteSize(0),
  76.             m_bUseSW(FALSE)
  77.     {
  78.     }
  79.  
  80.     ~SMeshContainer()
  81.     {
  82.         delete []rgMaterials;
  83.  
  84.         if (pTextures)
  85.         {
  86.             for (DWORD i = 0; i < cMaterials; ++i)
  87.             {
  88.                 GXRELEASE(pTextures[i]);
  89.             }
  90.             delete []pTextures;
  91.         }
  92.  
  93.         GXRELEASE(pMesh);
  94.         GXRELEASE(m_pSkinMesh);
  95.         GXRELEASE(m_pBoneNamesBuf);
  96.         GXRELEASE(m_pBoneOffsetBuf);
  97.         GXRELEASE(m_pBoneCombinationBuf);
  98.  
  99.         delete[] m_pBoneMatrix;
  100.  
  101.         delete[] m_pAttrTable;
  102.  
  103.         delete []szName;
  104.  
  105.         delete[] m_rgiAdjacency;
  106.  
  107.         delete pmcNext;
  108.     }
  109. };
  110.  
  111. // X File formation rotate key
  112. struct SRotateKeyXFile
  113. {
  114.     DWORD            dwTime;
  115.     DWORD            dwFloats;    
  116.     float            w;
  117.     float            x;
  118.     float            y;
  119.     float            z;
  120. };
  121.  
  122. struct SScaleKeyXFile
  123. {
  124.     DWORD    dwTime;
  125.     DWORD    dwFloats;    
  126.     D3DXVECTOR3    vScale;    
  127. };
  128.  
  129.  
  130. struct SPositionKeyXFile
  131. {
  132.     DWORD    dwTime;
  133.     DWORD    dwFloats;    
  134.     D3DXVECTOR3    vPos;    
  135. };
  136.  
  137. struct SMatrixKeyXFile
  138. {
  139.     DWORD    dwTime;
  140.     DWORD    dwFloats;    
  141.     D3DXMATRIX    mat;    
  142. };
  143.  
  144. // in memory versions
  145.  
  146. struct SRotateKey
  147. {
  148.     DWORD            dwTime;
  149.     D3DXQUATERNION    quatRotate;    
  150. };
  151.  
  152. struct SPositionKey
  153. {
  154.     DWORD    dwTime;
  155.     D3DXVECTOR3    vPos;    
  156. };
  157.  
  158. struct SScaleKey
  159. {
  160.     DWORD    dwTime;
  161.     D3DXVECTOR3    vScale;    
  162. };
  163.  
  164. struct SMatrixKey
  165. {
  166.     DWORD    dwTime;
  167.     D3DXMATRIXA16    mat;    
  168. };
  169.  
  170. struct SFrame
  171. {
  172.     SMeshContainer *pmcMesh;
  173.     D3DXMATRIXA16 matRot;
  174.     D3DXMATRIXA16 matTrans;
  175.     D3DXMATRIXA16 matRotOrig;
  176.     D3DXMATRIXA16 matCombined;
  177.  
  178.     // animation information
  179.     SPositionKey *m_pPositionKeys;
  180.     UINT m_cPositionKeys;
  181.     SRotateKey *m_pRotateKeys;
  182.     UINT m_cRotateKeys;
  183.     SScaleKey *m_pScaleKeys;
  184.     UINT m_cScaleKeys;
  185.     SMatrixKey *m_pMatrixKeys;
  186.     UINT m_cMatrixKeys;
  187.  
  188.     SFrame *pframeAnimNext;
  189.     SFrame *pframeToAnimate;
  190.  
  191.     SFrame *pframeSibling;
  192.     SFrame *pframeFirstChild;
  193.  
  194.     bool bAnimationFrame;
  195.     char *szName;
  196.  
  197.     SFrame()
  198.         :
  199.             pmcMesh(NULL),
  200.             m_pPositionKeys(NULL),
  201.             m_cPositionKeys(0),
  202.             m_pScaleKeys(NULL),
  203.             m_cScaleKeys(0),
  204.             m_pRotateKeys(NULL),
  205.             m_cRotateKeys(0),
  206.             m_pMatrixKeys(NULL),
  207.             m_cMatrixKeys(0),
  208.             pframeAnimNext(NULL),
  209.             pframeToAnimate(NULL),
  210.             pframeSibling(NULL),
  211.             pframeFirstChild(NULL),
  212.             bAnimationFrame(false),
  213.             szName(NULL)
  214.     {
  215.         D3DXMatrixIdentity(&matRot);
  216.         D3DXMatrixIdentity(&matRotOrig);
  217.         D3DXMatrixIdentity(&matTrans);
  218.     }
  219.  
  220.     ~SFrame()
  221.     {
  222.         delete []szName;
  223.         delete pmcMesh;        
  224.         delete pframeFirstChild;
  225.         delete pframeSibling;
  226.  
  227.         delete []m_pPositionKeys;
  228.         delete []m_pRotateKeys;
  229.         delete []m_pScaleKeys;
  230.         delete []m_pMatrixKeys;
  231.  
  232.         // do NOT delete pframeAnimNext
  233.         // do NOT delete pframeToAnimate
  234.     }
  235.  
  236.     void SetTime(float fTime);
  237.  
  238.     SFrame *FindFrame(char *szFrame)
  239.     {
  240.         SFrame *pframe;
  241.  
  242.         if ((szName != NULL) && (strcmp(szName, szFrame) == 0))
  243.             return this;
  244.  
  245.         if (pframeFirstChild != NULL)
  246.         {
  247.             pframe = pframeFirstChild->FindFrame(szFrame);
  248.             if (pframe != NULL)
  249.                 return pframe;
  250.         }
  251.  
  252.         if (pframeSibling != NULL)
  253.         {
  254.             pframe = pframeSibling->FindFrame(szFrame);
  255.             if (pframe != NULL)
  256.                 return pframe;
  257.         }
  258.  
  259.         return NULL;
  260.     }
  261.  
  262.     void ResetMatrix()
  263.     {
  264.         matRot = matRotOrig;
  265.         D3DXMatrixIdentity(&matTrans);        
  266.  
  267.         if (pframeFirstChild != NULL)
  268.         {
  269.             pframeFirstChild->ResetMatrix();
  270.         }
  271.  
  272.         if (pframeSibling != NULL)
  273.         {
  274.             pframeSibling->ResetMatrix();
  275.         }
  276.     }
  277.  
  278.     void AddFrame(SFrame *pframe)
  279.     {
  280.         if (pframeFirstChild == NULL)
  281.         {
  282.             pframeFirstChild = pframe;
  283.         }
  284.         else
  285.         {
  286.             pframe->pframeSibling = pframeFirstChild->pframeSibling;
  287.             pframeFirstChild->pframeSibling = pframe;
  288.         }
  289.     }
  290.  
  291.     void AddMesh(SMeshContainer *pmc)
  292.     {
  293.         pmc->pmcNext = pmcMesh;
  294.         pmcMesh = pmc;
  295.     }
  296. };
  297.  
  298. struct SDrawElement
  299. {
  300.     SFrame *pframeRoot;
  301.  
  302.     D3DXVECTOR3 vCenter;
  303.     float fRadius;
  304.  
  305.     // name of element for selection purposes
  306.     char *szName;
  307.  
  308.     // animation list
  309.     SFrame *pframeAnimHead;
  310.  
  311.     // next element in list
  312.     SDrawElement *pdeNext;
  313.  
  314.     float fCurTime;
  315.     float fMaxTime;
  316.  
  317.     SDrawElement()
  318.         :vCenter(0.0,0.0,0.0),
  319.             fRadius(1.0),
  320.             szName(NULL),
  321.             pframeRoot(NULL),
  322.             pframeAnimHead(NULL),
  323.             pdeNext(NULL)
  324.     {
  325.     }
  326.  
  327.     ~SDrawElement()
  328.     {
  329.         delete pframeRoot;
  330.         delete pdeNext;
  331.         delete [] szName;
  332.  
  333.         // do NOT delete pframeAnimHead;
  334.     }
  335.  
  336.     void AddAnimationFrame(SFrame *pframeAnim)
  337.     {
  338.         pframeAnim->pframeAnimNext = pframeAnimHead;
  339.         pframeAnimHead = pframeAnim;
  340.     }
  341.  
  342.     SFrame *FindFrame(char *szName)
  343.     {
  344.         if (pframeRoot == NULL)
  345.             return NULL;
  346.         else
  347.             return pframeRoot->FindFrame(szName);
  348.     }
  349. };
  350.  
  351. HRESULT CalculateBoundingSphere(SDrawElement *pdeCur);
  352.  
  353.  
  354.  
  355. extern DWORD      g_dwNumDeviceTypes;
  356. //-----------------------------------------------------------------------------
  357. // Name: class CMyD3DApplication
  358. // Desc: Application class. The base class (CD3DApplication) provides the 
  359. //       generic functionality needed in all Direct3D samples. CMyD3DApplication 
  360. //       adds functionality specific to this sample program.
  361. //-----------------------------------------------------------------------------
  362. class CMyD3DApplication : public CD3DApplication
  363. {
  364.     CD3DFont* m_pFont;
  365.  
  366.     METHOD m_method;
  367.  
  368.     DWORD m_dwFVF;
  369.  
  370.     CD3DArcBall   m_ArcBall;
  371.  
  372.     SMeshContainer *m_pmcSelectedMesh;
  373.     SFrame *m_pframeSelected;
  374.     SDrawElement *m_pdeSelected;
  375.     SDrawElement *m_pdeHead;
  376.  
  377.     TCHAR m_szPath[MAX_PATH];
  378.     LPD3DXMATRIXA16 m_pBoneMatrices;
  379.     DWORD m_maxBones;
  380.     DWORD m_dwIndexedVertexShader[4];
  381.     D3DXMATRIXA16 m_mView;
  382.  
  383. protected:
  384.     HRESULT OneTimeSceneInit();
  385.     HRESULT InitDeviceObjects();
  386.     HRESULT RestoreDeviceObjects();
  387.     HRESULT InvalidateDeviceObjects();
  388.     HRESULT DeleteDeviceObjects();
  389.     HRESULT Render();
  390.     HRESULT FrameMove();
  391.     HRESULT FinalCleanup();
  392.     HRESULT ConfirmDevice(D3DCAPS8*,DWORD,D3DFORMAT);
  393.  
  394.     HRESULT FindBones(SFrame *pframeCur, SDrawElement *pde);
  395.     HRESULT LoadMeshHierarchy();
  396.     HRESULT LoadAnimationSet(LPDIRECTXFILEDATA pxofobjCur, SDrawElement *pde,
  397.                              DWORD options, DWORD fvf, LPDIRECT3DDEVICE8 pD3DDevice,
  398.                              SFrame *pframeParent);
  399.     HRESULT LoadAnimation(LPDIRECTXFILEDATA pxofobjCur, SDrawElement *pde,
  400.                           DWORD options, DWORD fvf, LPDIRECT3DDEVICE8 pD3DDevice,
  401.                           SFrame *pframeParent);
  402.     HRESULT LoadFrames(LPDIRECTXFILEDATA pxofobjCur, SDrawElement *pde,
  403.                        DWORD options, DWORD fvf, LPDIRECT3DDEVICE8 pD3DDevice,
  404.                        SFrame *pframeParent);
  405.     HRESULT LoadMesh(LPDIRECTXFILEDATA pxofobjCur,
  406.                      DWORD options, DWORD fvf, LPDIRECT3DDEVICE8 pD3DDevice,
  407.                      SFrame *pframeParent);
  408.     HRESULT SetProjectionMatrix();
  409.     HRESULT DeleteSelectedMesh();
  410.     HRESULT DrawMeshContainer(SMeshContainer *pmcMesh);
  411.     HRESULT UpdateFrames(SFrame *pframeCur, D3DXMATRIX &matCur);
  412.     HRESULT GenerateMesh(SMeshContainer* pmcMesh);
  413.     HRESULT DrawFrames(SFrame *pframeCur, UINT &cTriangles);
  414.  
  415. public:
  416.     LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  417.     CMyD3DApplication();
  418.  
  419. };
  420.  
  421.  
  422. #endif
  423.  
  424.